#include <iostream>
#include <memory>
#include <sstream>
#include <string>
#include <jsoncpp/json/json.h>


std::string serialize()
{
     //1. 将需要进行序列化的数据，存储在Json::Value 对象中
    Json::Value root;
    root["姓名"]="张三";
    root["年龄"]=18;
    root["成绩"].append(100);
    root["成绩"].append(89);
    root["成绩"].append(99.5);
    //2. 实例化一个StreamWriterBuilder 工厂类对象
    Json::StreamWriterBuilder swb;
    //3. 通过StreamWriterBuilder工厂类对象生产一个StreamWrite对象
    std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
    //4. 使用StreamWrite对象，对Json::Value中存储的数据进行反序列化
    std::stringstream ss;
    int ret =sw->write(root, &ss);
    if(ret!=0){
        std::cout<<"Serialize failed!\n";
        return "";
    }
    std::cout << "序列化结果:\n" << ss.str() << std::endl;
    return ss.str();
}


void unserialize(std::string str)
{
    //1. 实列化一个CharReaderBuilder工厂类对象
    Json::CharReaderBuilder crb;
    //2. 使用CharReaderBuilder 工厂类生产一个CharRead
    // Json::CharReader* cr=crb.newCharReader();
    std::unique_ptr<Json::CharReader> cr(crb.newCharReader());
    //3. 定义一个Json::Value对象存储解析后的数据
    Json::Value root;
    std::string err;
    //4. 使用CharRead对象进行Json格式化字符串str的反序化
    bool ret=cr->parse(str.c_str(),str.c_str()+str.size(),&root,&err);
    if(ret==false){
        std::cout<<"json unserialize failed: "<<err<<std::endl;
        return;
    }
    //5. 逐个元素去访问Json::Value中的数据
    std::cout<< "姓名: "<<root["姓名"].asString()<<std::endl;
    std::cout<< "年龄: "<<root["年龄"].asInt()<<std::endl;
    int sz=root["成绩"].size();
    for(int i=0;i<sz;++i){
        std::cout<<"成绩: "<<root["成绩"][i].asFloat()<<std::endl;
    }
}

int main()
{
    std::string str=serialize();
    unserialize(str);
    return 0;
}